package com.sprouting.ops.model.bo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.sprouting.ops.annotations.invoke.CheckIsNullOrEmpty;
import com.sprouting.ops.annotations.invoke.CheckLength;
import com.sprouting.ops.annotations.invoke.CheckNotNull;
import com.sprouting.ops.interfaces.AddGroup;
import com.sprouting.ops.interfaces.UpdGroup;
import com.sprouting.ops.model.*;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * 部署应用到计算机中
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2025/7/7 17:41
 */
@Data
public class OpsDeployComputerBo {

    /**
     * 主键
     */
    @CheckNotNull(message = "非法ID", groups = UpdGroup.class)
    @CheckIsNullOrEmpty(message = "无效ID", groups = AddGroup.class)
    private String id;
    /**
     * 隶属场所
     * @see OpsSite#getId()
     */
    private String siteId;
    /**
     * 计算机id
     * @see OpsComputerServer#getId()
     */
    @CheckNotNull(message = "必须选择计算机")
    private String computerServerId;
    /**
     * 部署基础位置
     */
    @CheckLength(max = 1000, message = "部署基础位置超过长度限制")
    private String basePath;
    /**
     * 启动和关闭方式
     */
    private String startEnd;
    /**
     * 部署过程
     */
    private String deployProcess;
    /**
     * 验证方式
     */
    private String verification;
    /**
     * 使用网络端口，可以多个,多个使用英文逗号分隔
     */
    @CheckLength(max = 300, message = "网络端口超过长度限制")
    private String ports;
    /**
     * 部署人
     */
    private String deployUser;
    /**
     * 部署时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
    private Date deployTime;
    /**
     * 备份目录
     */
    private String bakPath;
    /**
     * 类型，应用、组件
     * @see com.sprouting.ops.interfaces.ConstantBase.OpsDeployType
     */
    @NotNull(message = "必须选择一个类型")
    private Integer type;
    /**
     * 应用tag-应用
     * 当是应用的时候就可能会有值
     */
    @CheckLength(max = 255, message = "tag超过长度限制")
    private String tag;
    /**
     * 应用分支-应用
     * @see OpsAppBranch#getId()
     */
    private String appBranchId;
    /**
     * 应用ID-应用
     * @see OpsApp#getId()
     */
    private String appId;
    /**
     * 组件版本id-组件
     * @see OpsComponentVersion#getId()
     */
    private String componentVersionId;
    /**
     * 隶属组件-组件
     * @see OpsComponent#getId()
     */
    private String componentId;


    /*
    === 关联部署信息
     */

    /**
     * 所属环境id
     * @see OpsEnv#getId()
     */
    @CheckNotNull(message = "必须选择一个环境")
    private String envId;

}
